import SCons.Util
import xml.dom.minidom, re

################################################################################
# XSL-FO builder
################################################################################

def generate(env) :
	def generate_actions(source, target, env, for_signature) :
		if len(env["FOCFG"]) > 0 :
			cmd = "$FO -c $FOCFG $FOFLAGS $SOURCE $TARGET"
		else :
			cmd = "$FO $FOFLAGS $SOURCE $TARGET"
		return SCons.Action.Action(cmd, cmdstr = "$FOCOMSTR")

	def modify_sources(target, source, env) :
		if len(env["FOCFG"]) > 0 :
			source.append(env["FOCFG"])
		return target, source

	def scan_fo(node, env, path) :
		dependencies = set()
		try :
			document = xml.dom.minidom.parseString(node.get_contents())
		except xml.parsers.expat.ExpatError:
			return []
		for include in document.getElementsByTagNameNS("http://www.w3.org/1999/XSL/Format", "external-graphic") :
			m = re.match("url\((.*)\)", include.getAttribute("src"))
			if m :
				dependencies.add(m.group(1))
		return list(dependencies)

	env["FO"] = "fop"
	env["FOFLAGS"] = ""
	env["FOCFG"] = ""
	env["BUILDERS"]["FO"] = SCons.Builder.Builder(
				generator = generate_actions,
				emitter = modify_sources,
				source_scanner = SCons.Scanner.Scanner(function = scan_fo, skeys = [".fo"]),
				suffix = ".pdf",
				src_suffix = ".fo"
			)

def exists(env) :
	return True
